import java.util.ArrayList;

public class Estatistica02 extends Estatisticas
{
	double estimadorMediaDownload = 0;
	double estimadorVarianciaMedia = 0;
	double limiteSuperior = 0;
	double limiteInferior = 0;
	double tempoMedioDownload = 0;
	public int deltaTAtual = 1;
	public int tempoEstavel = 0;
	public double tamDelta = 100;
	double somatorioDelta = 0;
	double mediaTotal;
	double mediaDelta;
	double tempoInicioDelta = 0;
	public int quantEstavel = 0;
	public double tempoAnterior = 0;
	boolean faseTransienteCalculada = false;

	public void calcFaseTransiente(int quantidadeUsuario, double tempoAtual)
	{
		if (tempoInicioDelta == 0) tempoInicioDelta = tempoAtual;
		if (tempoAtual - tempoInicioDelta < tamDelta)
		{
			somatorioDelta += (tempoAtual - tempoAnterior) * quantidadeUsuario;
		}
		else
		{
			mediaDelta = somatorioDelta / (tempoAtual - tempoInicioDelta);
			mediaTotal = (mediaTotal * (deltaTAtual - 1) + mediaDelta) / deltaTAtual;
			if (Math.abs(mediaDelta - mediaTotal) < 0.001)
			{
				System.out.println("Fim da fase transiente: " + tempoAtual);
				faseTransienteCalculada = true;

			}
			else
			{
				tempoEstavel = 0;
			}
			tempoInicioDelta = 0;
			somatorioDelta = 0;
			deltaTAtual++;
		}
		tempoAnterior = tempoAtual;
	}

	public void calcEstimadorMediaDownload(double mediaDownload, int quantidade)
	{
		estimadorMediaDownload = (estimadorMediaDownload * (quantidade - 1) + mediaDownload) / quantidade;
	}

	public void calcTempoDownload(double tempoInicio, double tempoFim, int quantidade)
	{
		tempoMedioDownload = (tempoMedioDownload * (quantidade - 1) + (tempoFim - tempoInicio)) / quantidade;
	}

	private void calcEstimadorVarianciaMedia(ArrayList<Rodada> rodadas)
	{
		for (Rodada r : rodadas)
		{
			estimadorVarianciaMedia += (r.mediaDownload - estimadorMediaDownload) * (r.mediaDownload - estimadorMediaDownload);
		}
		estimadorVarianciaMedia /= (rodadas.size() - 1);
	}

	public void calcLimites(ArrayList<Rodada> rodadas)
	{
		calcEstimadorVarianciaMedia(rodadas);
		calcLimiteInferior(rodadas.size());
		calcLimiteSuperior(rodadas.size());
	}

	private void calcLimiteInferior(int numeroAmostras)
	{
		limiteInferior = estimadorMediaDownload - 1.96 * Math.sqrt(estimadorVarianciaMedia) / Math.sqrt(numeroAmostras);
	}

	private void calcLimiteSuperior(int numeroAmostras)
	{
		limiteSuperior = estimadorMediaDownload + 1.96 * Math.sqrt(estimadorVarianciaMedia) / Math.sqrt(numeroAmostras);
	}

	public double getTempoMedioDownload()
	{
		return tempoMedioDownload;
	}

	public void clear()
	{
		tempoMedioDownload = 0;
	}
}
